package com.offics.loan.domain.repository;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.offics.loan.domain.entity.Loan;

import java.util.List;
import java.util.Optional;

/**
 * 贷款仓储接口
 */
public interface LoanRepository {

    /**
     * 根据ID查询贷款
     *
     * @param id 贷款ID
     * @return 贷款信息
     */
    Optional<Loan> findById(Long id);

    /**
     * 根据贷款编号查询贷款
     *
     * @param loanNo 贷款编号
     * @return 贷款信息
     */
    Optional<Loan> findByLoanNo(String loanNo);

    /**
     * 根据用户ID查询贷款列表
     *
     * @param userId 用户ID
     * @return 贷款列表
     */
    List<Loan> findByUserId(Long userId);

    /**
     * 根据用户ID和状态查询贷款列表
     *
     * @param userId 用户ID
     * @param status 状态
     * @return 贷款列表
     */
    List<Loan> findByUserIdAndStatus(Long userId, Integer status);

    /**
     * 分页查询贷款列表
     *
     * @param page 分页参数
     * @param userId 用户ID
     * @param status 状态
     * @return 分页结果
     */
    IPage<Loan> findPage(IPage<Loan> page, Long userId, Integer status);

    /**
     * 保存贷款
     *
     * @param loan 贷款信息
     * @return 保存后的贷款信息
     */
    boolean save(Loan loan);

    /**
     * 保存贷款并返回保存后的贷款
     *
     * @param loan 贷款信息
     * @return 保存后的贷款信息
     */
    Loan saveAndReturn(Loan loan);

    /**
     * 更新贷款
     *
     * @param loan 贷款信息
     * @return 是否成功
     */
    boolean update(Loan loan);

    /**
     * 根据ID删除贷款
     *
     * @param id 贷款ID
     * @return 是否成功
     */
    boolean deleteById(Long id);

    /**
     * 根据用户ID删除贷款
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteByUserId(Long userId);

    /**
     * 生成贷款编号
     *
     * @return 贷款编号
     */
    String generateLoanNo();

    /**
     * 检查贷款编号是否存在
     *
     * @param loanNo 贷款编号
     * @return 是否存在
     */
    boolean existsByLoanNo(String loanNo);
}
